package com.z.redis.datatype;

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class RedisList implements RedisData{
    private volatile long timeout = -1;
    private final Deque<BytesWrapper> deque = new LinkedList<>();

    /**
     * 从列表的头部添加元素
     * lpush key value [value ...]
     * @param values
     */
    public void lpush(BytesWrapper... values){
        for(BytesWrapper value : values){
            deque.addFirst(value);
        }
    }
    public void lpush(List<BytesWrapper> values){
        for(BytesWrapper value : values){
            deque.addFirst(value);
        }
    }

    /**
     * 向列表的尾部添加元素怒
     * rpush key value [value ...]
     * @param values
     */
    public void rpush(List<BytesWrapper> values){
        for(BytesWrapper value : values){
            deque.addLast(value);
        }
    }

    public void rpush(BytesWrapper... values){
        for(BytesWrapper value : values){
            deque.addLast(value);
        }
    }

    /**
     * 获取列表指定范围内的元素
     * lrange key start end
     * @param start
     * @param end
     * @return 指定范围的元素
     */
    public List<BytesWrapper> lrange(int start, int end){
        return deque.stream()
                .skip(start)
                .limit(end - start >= 0 ? end - start + 1 : 0)
                .collect(Collectors.toList());
    }

    //TODO 可能要补充count参数
    /**
     * 删除所有与value相等的元素
     * lrem key count value
     * @param value
     * @return
     */
    public int remove(BytesWrapper value){
        int count = 0;
        while(deque.remove(value)){ count++; }  // 遍历删除所有匹配元素
        return count;
    }

    public BytesWrapper rpop(){
        return deque.pollLast();
    }

    @Override
    public long getTimeout(){
        return timeout;
    }
    @Override
    public void setTimeout(long timeout){
        this.timeout = timeout;
    }

    public int size() {
        return deque.size();
    }
}
